package top.itaso.lib.widget.tpv;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;

import top.itaso.lib.widget.R;

/**
 * @Description: R4 闪传应用中 文件 的菜单面板
 * @Author dengfu.su
 * @Date 2023/1/12
 */
public class TpvFileMenuBarView extends LinearLayout {
    private final String TAG = this.getClass().getSimpleName();

    /**
     * Menubar 上 menu 的事件回调
     */
    public interface IMenuCallback {
        void onMenuCheckMult();

        void onMenuCheckAll();

        void onMenuCheckCancel();

        void onMenuCheckFile();

        void onMenuInsertIwb();

        void onMenuSave();

        void onMenuDel();

        void onMenuExit();
    }

    /**
     * 单选 状态-默认状态，此时 menubar 中 按钮应该显示 多选
     */
    private int CHECK_MODEL = CHECK_SINGLE;//0

    //多选、全选、取消 三个按钮属于互斥关系，故使用 位 做开关控制
    /**
     * 单选 状态-默认状态，此时 menubar 中 按钮应该显示 多选
     */
    private static final int CHECK_SINGLE = 1 << 0;//0
    /**
     * 多选 状态，此时 menubar 中 按钮应该显示 全选
     */
    private static final int CHECK_MULT = 1 << 1;//2
    /**
     * 全选 状态，此时 menubar 中 按钮应该显示 取消
     */
    private static final int CHECK_ALL = 1 << 2;//4

    /**
     * 标记 使用以及走过 init 流程，简化接口被外部调用时控件为空问题
     */
    private boolean isReadyOk = false;

    private IMenuCallback menuCallback;

    private TextView menuCheckMult;
    private TextView menuCheckAll;
    private TextView menuCheckCancel;
    private TextView menuCheckFile;
    private TextView menuInsertIwb;
    private TextView menuSave;
    private TextView menuDel;
    private TextView menuExit;

    public TpvFileMenuBarView(Context context) {
        this(context, null);
    }

    public TpvFileMenuBarView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TpvFileMenuBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOrientation(LinearLayout.HORIZONTAL);
        setGravity(Gravity.CENTER_VERTICAL);
        setBackground(getResources().getDrawable(R.drawable.ic_tpv_menu_bg));
        int padding = dp2px(10);
        setPadding(padding, padding, padding, padding);
        initView();
        isReadyOk = true;
        setCheckModel(CHECK_SINGLE, false);
    }

    /**
     * 设置 Menubar 的事件回调
     *
     * @param menuCallback
     */
    public void setMenuCallback(IMenuCallback menuCallback) {
        this.menuCallback = menuCallback;
    }

    /**
     * 获取当前的操作模式，
     *
     * @return CHECK_SINGLE-单选模式，CHECK_MULT-多选模式，CHECK_ALL-全选模式
     */
    public int getCurModel() {
        return CHECK_MODEL;
    }

    /**
     * 更新 Menu 的内容
     * PS：全选 时，存在两种情况，被选择数只有 1 和 大于1，如需区分这两种的 menubar 内容，则需主动在调用一次 setMenuBarStatus() 进行刷新真实状态
     *
     * @param checkCount   当前模式下是否 正 选择了文件（大于1时，checkCount 只要 是大于1的任何数字均可，无需与真实数对应）
     * @param isCheckedAll 当前数据是否全部被选中状态，true-已全选，false-未被全选
     */
    public synchronized void setMenuBarStatus(int checkCount, boolean isCheckedAll) {
        Log.d(TAG, "setMenuBarStatus: >>>>>>checkCount=" + checkCount + ",isCheckedAll=" + isCheckedAll + ",CHECK_MODEL=" + CHECK_MODEL);
        if (checkCount <= 0) {//单选或者多选模式下，只要 文件选中数=0 时，那么以下 menu 按钮均不可见
            menuCheckFile.setVisibility(GONE);
            menuInsertIwb.setVisibility(GONE);
            menuSave.setVisibility(GONE);
            menuDel.setVisibility(GONE);
            if (CHECK_MODEL == CHECK_SINGLE) {
                menuExit.setVisibility(GONE);
            } else {
                menuExit.setVisibility(VISIBLE);
            }
            return;
        }
        //单选或者多选模式下，文件选中数 >1 时，只选中一个文件时，比选中多个文件多出 查看+导入白板 的按钮（备注：别转牛角尖，单选模式下，checkCount只会=1）
        menuExit.setVisibility(VISIBLE);
        menuSave.setVisibility(VISIBLE);
        menuDel.setVisibility(VISIBLE);
        switch (CHECK_MODEL) {
            case CHECK_MULT:
            case CHECK_ALL:
                menuCheckMult.setVisibility(GONE);
                menuCheckAll.setVisibility(isCheckedAll ? GONE : VISIBLE);
                menuCheckCancel.setVisibility(isCheckedAll ? VISIBLE : GONE);

                menuCheckFile.setVisibility(checkCount > 1 ? GONE : VISIBLE);
                menuInsertIwb.setVisibility(checkCount > 1 ? GONE : VISIBLE);
                break;
            case CHECK_SINGLE:
                menuCheckMult.setVisibility(VISIBLE);
                menuCheckAll.setVisibility(GONE);
                menuCheckCancel.setVisibility(GONE);

                menuCheckFile.setVisibility(VISIBLE);
                menuInsertIwb.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }

    @Override
    public void setVisibility(int visibility) {
        //显示和隐藏切换时，强制切回初始状态，确保比如 删除、退出 等功能执行后下一次可见的状态异常
        if (visibility != VISIBLE) {
            setCheckModel(CHECK_SINGLE, false);
        }
        super.setVisibility(visibility);
    }

    private void initView() {
        menuCheckMult = createMenuTextView("多选", R.drawable.selector_ic_check_mult);
        menuCheckAll = createMenuTextView("全选", R.drawable.selector_ic_check_all);
        menuCheckCancel = createMenuTextView("取消", R.drawable.selector_ic_check_cancel);
        menuCheckFile = createMenuTextView("查看", R.drawable.selector_ic_check_file);
        menuInsertIwb = createMenuTextView("导入白板", R.drawable.selector_ic_insert_iwb);
        menuSave = createMenuTextView("保存", R.drawable.selector_ic_save);
        menuDel = createMenuTextView("删除", R.drawable.selector_ic_del);
        menuExit = createMenuTextView("退出", R.drawable.selector_ic_exit);

        // 初始 显示状态，默认仅 多选 功能
        menuCheckAll.setVisibility(GONE);
        menuCheckCancel.setVisibility(GONE);
        menuCheckFile.setVisibility(GONE);
        menuInsertIwb.setVisibility(GONE);
        menuSave.setVisibility(GONE);
        menuDel.setVisibility(GONE);
        menuExit.setVisibility(GONE);

        addView(menuCheckMult);
        addView(menuCheckAll);
        addView(menuCheckCancel);
        addView(menuCheckFile);
        addView(menuInsertIwb);
        addView(menuSave);
        addView(menuDel);
        addView(menuExit);

        //监听事件
        menuCheckMult.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuCheckMult.getText().toString() + "被点击了");
                setCheckModel(CHECK_MULT, false);
                if (menuCallback != null) {
                    menuCallback.onMenuCheckMult();
                }
            }
        });
        menuCheckAll.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuCheckAll.getText().toString() + "被点击了");
                setCheckModel(CHECK_ALL, true);
                if (menuCallback != null) {
                    menuCallback.onMenuCheckAll();
                }
            }
        });
        menuCheckCancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuCheckCancel.getText().toString() + "被点击了");
                setCheckModel(CHECK_MULT, false);
                if (menuCallback != null) {
                    menuCallback.onMenuCheckCancel();
                }
            }
        });
        menuCheckFile.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuCheckFile.getText().toString() + "被点击了");
                if (menuCallback != null) {
                    menuCallback.onMenuCheckFile();
                }
            }
        });
        menuInsertIwb.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuInsertIwb.getText().toString() + "被点击了");
                if (menuCallback != null) {
                    menuCallback.onMenuInsertIwb();
                }
            }
        });
        menuSave.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuSave.getText().toString() + "被点击了");
                if (menuCallback != null) {
                    menuCallback.onMenuSave();
                }
            }
        });
        menuDel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuDel.getText().toString() + "被点击了");
                if (menuCallback != null) {
                    menuCallback.onMenuDel();
                }
            }
        });
        menuExit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: >>>>>>" + menuExit.getText().toString() + "被点击了");
                setCheckModel(CHECK_SINGLE, false);
                if (menuCallback != null) {
                    menuCallback.onMenuExit();
                }
            }
        });
    }

    /**
     * 提供 创建 操作面板中 事件 的视图
     *
     * @return
     */
    private TextView createMenuTextView(String title, @DrawableRes int res) {
        Drawable drawableIcon = getResources().getDrawable(res);//R.mipmap.ic_bluetooth
        drawableIcon.setBounds(0, 0, drawableIcon.getMinimumWidth() + dp2px(2), drawableIcon.getMinimumHeight() + dp2px(2));

        TextView textView = new TextView(getContext());
        textView.setPadding(0, dp2px(2), 0, 0);
//        textView.setCompoundDrawablePadding(dp2px(4));
        textView.setSingleLine();
        textView.setCompoundDrawables(null, drawableIcon, null, null);
        textView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
//        textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
        textView.setTextColor(getResources().getColorStateList(R.color.selector_bg_color_1));
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 8);
        textView.setGravity(Gravity.CENTER);

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dp2px(36), dp2px(32));
//        params.setMargins(dp2px(5), dp2px(5), dp2px(5), dp2px(5));
        textView.setLayoutParams(params);

        textView.setText(title);
        return textView;
    }


    /**
     * 设置 当前 操作模式，分别为 单选、多选、全选
     * PS：全选 时，存在两种情况，被选择数只有 1 和 大于1，如需区分这两种的 menubar 内容，则需主动在调用一次 setMenuBarStatus() 进行刷新真实状态
     *
     * @param menuModel    当前模式下的操作
     * @param isCheckedAll 是否全选情况，true-即文件已全部选中时，false-文件未全部选中
     */
    private void setCheckModel(int menuModel, boolean isCheckedAll) {
        Log.d(TAG, "setCheckModel: >>>>>>menuModel=" + menuModel + ",isCheckedAll=" + isCheckedAll + ",isReadyOk=" + isReadyOk);
        if (!isReadyOk) {
            return;
        }
        CHECK_MODEL = menuModel;

        menuCheckMult.setVisibility(CHECK_MODEL == CHECK_SINGLE ? VISIBLE : GONE);
        menuCheckAll.setVisibility(CHECK_MODEL == CHECK_MULT ? VISIBLE : GONE);
        menuCheckCancel.setVisibility(CHECK_MODEL == CHECK_ALL ? VISIBLE : GONE);
        if (CHECK_MODEL == CHECK_ALL) {
            setMenuBarStatus(2, isCheckedAll);
        } else {
            setMenuBarStatus(0, isCheckedAll);
        }

    }

    /**
     * 根据分辨率从 dp 的单位 转成为 px(像素)
     */
    private int dp2px(float dpValue) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
